package io.youngledo.usb.util;

import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.WritableImage;
import javafx.scene.paint.Color;
import javafx.scene.paint.LinearGradient;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 图标管理器 - 使用Java 21特性创建现代化图标
 * 为应用程序生成自定义图标
 */
@Slf4j
public class IconManager {

    /**
     * 创建应用程序图标 - 使用现代化设计
     *
     * @param size 图标大小
     * @return 生成的图标图像
     */
    public static Image createApplicationIcon(int size) {
        Canvas canvas = new Canvas(size, size);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        // 创建渐变背景
        var gradient = LinearGradient.valueOf(
                "linear-gradient(to bottom right, #2196F3 0%, #1976D2 50%, #0D47A1 100%)"
        );

        // 绘制圆形背景
        gc.setFill(gradient);
        gc.fillOval(2, 2, size - 4, size - 4);

        // 添加边框
        gc.setStroke(Color.WHITE);
        gc.setLineWidth(2);
        gc.strokeOval(2, 2, size - 4, size - 4);

        // 绘制云存储图标 (使用Unicode字符)
        gc.setFill(Color.WHITE);
        gc.setFont(Font.font("System", FontWeight.BOLD, size * 0.3));

        // 云朵符号
        String cloudIcon = "☁";
        // 使用简单的估算方式，因为 computeStringWidth 在 JavaFX 21 中已被弃用
        var cloudTextWidth = gc.getFont().getSize() * 0.8; // 估算文本宽度
        gc.fillText(cloudIcon, (size - cloudTextWidth) / 2, size * 0.4);

        // 文件夹符号 (稍小一些，位于下方)
        gc.setFont(Font.font("System", FontWeight.BOLD, size * 0.2));
        String folderIcon = "📁";
        var folderTextWidth = gc.getFont().getSize() * 0.8; // 估算文本宽度
        gc.fillText(folderIcon, (size - folderTextWidth) / 2, size * 0.75);

        return canvas.snapshot(null, null);
    }

    /**
     * 创建多种尺寸的应用程序图标
     *
     * @return 图标数组，包含不同尺寸
     */
    public static Image[] createApplicationIcons() {
        // 常见的图标尺寸
        int[] sizes = {16, 24, 32, 48, 64, 128, 256};
        Image[] icons = new Image[sizes.length];

        for (int i = 0; i < sizes.length; i++) {
            icons[i] = createApplicationIcon(sizes[i]);
        }

        return icons;
    }

    /**
     * 创建基于文本的图标 - 现代化实现
     *
     * @param text            显示的文本
     * @param size            图标大小
     * @param backgroundColor 背景颜色
     * @param textColor       文字颜色
     * @return 生成的图标
     */
    public static Image createTextIcon(String text, int size, Color backgroundColor, Color textColor) {
        Canvas canvas = new Canvas(size, size);
        GraphicsContext gc = canvas.getGraphicsContext2D();

        // 绘制背景
        gc.setFill(backgroundColor);
        gc.fillRoundRect(0, 0, size, size, size * 0.1, size * 0.1);

        // 绘制文本
        gc.setFill(textColor);
        gc.setFont(Font.font("System", FontWeight.BOLD, size * 0.4));

        // 使用简单的估算方式替代已弃用的方法
        var textWidth = gc.getFont().getSize() * text.length() * 0.6; // 估算文本宽度
        var textHeight = gc.getFont().getSize();

        gc.fillText(text,
                (size - textWidth) / 2,
                (size + textHeight) / 2 - textHeight * 0.1);

        return canvas.snapshot(null, null);
    }

    /**
     * 创建状态图标 - 使用现代化设计语言
     */
    public static class StatusIcons {

        public static Image createSuccessIcon(int size) {
            return createTextIcon("✓", size, Color.web("#4CAF50"), Color.WHITE);
        }

        public static Image createErrorIcon(int size) {
            return createTextIcon("✗", size, Color.web("#F44336"), Color.WHITE);
        }

        public static Image createWarningIcon(int size) {
            return createTextIcon("⚠", size, Color.web("#FF9800"), Color.WHITE);
        }

        public static Image createInfoIcon(int size) {
            return createTextIcon("ⓘ", size, Color.web("#2196F3"), Color.WHITE);
        }

        public static Image createLoadingIcon(int size) {
            return createTextIcon("⟳", size, Color.web("#9E9E9E"), Color.WHITE);
        }
    }

    /**
     * 存储类型图标
     */
    public static class StorageTypeIcons {

        public static Image createMinIOIcon(int size) {
            return createTextIcon("M", size, Color.web("#C72C48"), Color.WHITE);
        }

        public static Image createAliyunIcon(int size) {
            return createTextIcon("阿", size, Color.web("#FF6A00"), Color.WHITE);
        }

        public static Image createTencentIcon(int size) {
            return createTextIcon("T", size, Color.web("#006EFF"), Color.WHITE);
        }

        public static Image createHuaweiIcon(int size) {
            return createTextIcon("华", size, Color.web("#FF0000"), Color.WHITE);
        }
    }

    /**
     * 将JavaFX图像保存为PNG文件
     *
     * @param image JavaFX图像
     * @param file  目标文件
     */
    public static void savePngFile(Image image, java.io.File file) {
        try {
            WritableImage writableImage = new WritableImage((int) image.getWidth(), (int) image.getHeight());
            javafx.scene.canvas.Canvas canvas = new javafx.scene.canvas.Canvas(image.getWidth(), image.getHeight());
            javafx.scene.canvas.GraphicsContext gc = canvas.getGraphicsContext2D();
            gc.drawImage(image, 0, 0);

            WritableImage snapshot = canvas.snapshot(null, writableImage);

            // 使用JavaFX内置的方法保存为PNG
            javax.imageio.ImageIO.write(javafx.embed.swing.SwingFXUtils.fromFXImage(snapshot, null), "png", file);
        } catch (Exception e) {
            System.err.println("Failed to save PNG file: " + e.getMessage());
        }
    }

    /**
     * macOS专用：生成并保存多种尺寸的PNG图标文件
     */
    public static void generateIconsForMacOS() {
        // 创建图标目录
        java.io.File iconDir = new java.io.File("src/main/resources/icons");
        if (!iconDir.exists()) {
            iconDir.mkdirs();
        }

        // 生成不同尺寸的PNG图标
        int[] sizes = {16, 32, 64, 128, 256, 512, 1024};
        for (int size : sizes) {
            Image icon = createApplicationIcon(size);
            java.io.File iconFile = new java.io.File(iconDir, "usb-icon-" + size + ".png");
            savePngFile(icon, iconFile);
            log.debug("Generated icon: {}", iconFile.getName());
        }
    }

}